package com.yy.controller;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.spring.util.ObjectUtils;
import com.yy.common.Resault;
import com.yy.domain.Bicycle;
import com.yy.domain.Order;
import com.yy.domain.User;
import com.yy.dto.OrderDTO;
import com.yy.feign.BicycleFeign;
import com.yy.feign.MemberFeign;
import com.yy.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private MemberFeign memberFeign;

    @Autowired
    private BicycleFeign bicycleFeign;

    /**
     * 接口说明：会员使用单车
     * 请求方式：POST
     * 请求url：/order-service/order/useBycicle
     * 请求参数说明：
     * 参数	是否必须	参数类型	说明
     * userId	是	Integer	用户id
     * bicycleId	是	Integer	单车id
     * 响应结果说明：
     * 参数	说明
     * code	返回状态码正常为200
     * msg	消息
     * data	返回数据
     * 接口备注：如果会员有车辆没有归还，则不能继续用车，注意并发用车问题
     */
    @PostMapping("/useBycicle")
    public Resault useBycicle(Integer userId,Integer bicycleId){

        User user=memberFeign.getMember(userId);
        System.out.println(user.getState());
        if (user.getState().equals(1)){
            return new Resault(-1,"您有车还木有还，请先还车");
        }
        Bicycle bicycle=bicycleFeign.getBicycleById(bicycleId);
        if (bicycle.getState().equals(1)){
            return new Resault(-1,"改车已被租");
        }
        //租车开始
        user.setState(1);
        bicycle.setState(1);
        memberFeign.updateMember(user);
        bicycleFeign.updateBicycle(bicycle);
        //生成订单
        this.orderService.createOrder(userId,bicycleId);

        return new Resault(200,"借车成功");

    }


    /**
     * 接口说明：会员锁车还车
     * 请求方式：GET
     * 请求url：/order-service/order/backBycicle
     * 请求参数说明：
     * 参数	是否必须	参数类型	说明
     * userId	是	Integer	用户id
     * orderSn	是	String	订单号
     * 响应结果说明：
     * 参数	说明
     * code	返回状态码正常为200
     * msg	消息
     * data	返回数据
     * 接口备注：锁车时计算用车费用，费用为：用车时间(单位为分钟，不足一分钟按1分钟计算)*1.5 元 ，用户的积分可以抵扣车费，每两个积分抵扣0.5元车费。以上操作完成后给会员增加一个积分。
     */
    @GetMapping("/backBycicle")
    public Resault backBycicle(Integer userId,String orderId){
        User user=memberFeign.getMember(userId);
        if (ObjectUtil.isEmpty(user)){
            return new Resault(-1,"用户不存在");
        }
        if (user.getState().equals(0)){
            return new Resault(-1,"改用户没有用车");
        }
        Order order=this.orderService.getOrderById(orderId);
        //获取费用
        Date date=new Date();
        long time=(date.getTime()-order.getStartTime().getTime())/1000;
        Double cost=time*(1.5);
        //查看用户是否有积分
        if (!user.getIntegral().equals(0)){
            Double diko=user.getIntegral()*(0.25);
            cost=cost-diko;
        }
        //扣钱
        Long finalMoney=user.getBanlance()-cost.longValue();
        if (finalMoney<0){
            return new Resault(-1,"支付失败，你没钱");
        }
        //修改用户状态
        user.setBanlance(finalMoney);
        user.setIntegral(0);
        user.setState(0);
        memberFeign.updateMember(user);

        //修改单车状态
        Integer bicycleId=order.getBicycleId();
        Bicycle bicycle=bicycleFeign.getBicycleById(bicycleId);
        bicycle.setState(0);

        //完善订单
        order.setRemark("已完成");
        order.setEndTime(new Date());
        order.setCost(cost);
        this.orderService.updateOrder(order);




        return new Resault(200,"还车成功");
    }


    /**
     * 接口说明：分页查询会员用车的记录
     * 请求方式：GET
     * 请求url：/order-service/order/getMemberOrder
     */
    @GetMapping("/getMemberOrder")
    public Resault getMemberOrder(OrderDTO orderDTO){
        Resault<List<Order>> orderList=this.orderService.queryAllBicycle(orderDTO);
        return orderList;
    }













}
